/*
Continuous Testing Toolkit
Copyright (C) 2009 Paul R. Holser, Jr.

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
*/

package org.infinitest.toolkit.filter;

import java.util.List;
import java.util.Properties;

import static com.google.common.collect.Lists.*;
import static org.apache.commons.lang.StringUtils.*;
import static org.infinitest.toolkit.filter.FilteringRunnerHelper.*;

/**
 * A set of commonly used test types that can be used as a convenience for categorizing tests.
 * <p>
 * This annotation does not have to be used, since test filtering is ultimately determined by String matching.
 * For example, the following two example are effectively the same:
 * <pre>
 * &#64;RunWith(FilteringRunner.class)
 * &#64;Type(TestType.UNIT)
 * public void ASampleTest {
 *     ...
 * }
 * </pre>
 *
 * <pre>
 * &#64;RunWith(FilteringRunner.class)
 * &#64;Type(name = "UNIT")
 * public void AnotherSampleTest {
 *     ...
 * }
 * </pre>
 * However, using this annotation could lead to a cleaner, less error prone, and more consistent test categorization.
 * </p>
 *
 * @author Ryan Breidenbach
 */
public enum TestType {
    ALL,
    CONTAINER,
    FUNCTIONAL,
    INTEGRATION,
    LOAD,
    PERFORMANCE,
    SLOW,
    UNIT,
    WEB;

    static List<String> testTypesFrom(Properties properties) {
        String testType = properties.getProperty(TEST_TYPE_PROPERTY_KEY);
        if (isBlank(testType))
            testType = ALL.name();
        return parseTypes(testType);
    }

    private static List<String> parseTypes(String testTypeProperty) {
        List<String> typesToMatch = newArrayList();
        for (String each : testTypeProperty.toUpperCase().split("[, ]"))
            typesToMatch.add(each.trim());
        return typesToMatch;
    }
}
